home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_number / number.e < prev    next >
Text File  |  2000-03-25  |  19KB  |  918 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. deferred class  NUMBER
  13.    --
  14.    -- This abstract definition of a NUMBER is intended to be the unique 
  15.    -- view of the client (do not use sub-classes names at all in the 
  16.    -- client code). In order to create NUMBERs without using concrete 
  17.    -- class name, the client code can inherit NUMBER_TOOLS (see directory 
  18.    -- ${SmallEiffel}/lib_show/number for example.
  19.    --
  20.    
  21. inherit
  22.    HASHABLE
  23.       undefine
  24.      is_equal
  25.       redefine
  26.      fill_tagged_out_memory, out_in_tagged_out_memory
  27.       end;      
  28.  
  29. feature -- Binary operators for two NUMBERs :
  30.    
  31.    infix "+" (other: NUMBER): NUMBER is
  32.      -- Sum of `Current' and `other'.
  33.       require
  34.      other /= Void
  35.       deferred
  36.       ensure
  37.      Result /= Void
  38.       end;
  39.  
  40.    infix "-" (other: NUMBER): NUMBER is
  41.      -- Difference of `Current' and `other'.
  42.       require
  43.      other /= Void
  44.       do
  45.      Result := Current + (- other);
  46.       ensure
  47.      Result /= Void
  48.       end;
  49.    
  50.    infix "*" (other: NUMBER): NUMBER is
  51.      -- Product of 'Current' and 'other'.
  52.       require
  53.      other /= Void
  54.       deferred
  55.       ensure
  56.      Result /= Void
  57.       end;
  58.  
  59.    infix "/" (other: NUMBER): NUMBER is
  60.      -- Quotient of `Current' and `other'.
  61.       require
  62.      not (other @= 0)
  63.      divisible(other);
  64.       do
  65.      Result := Current * other.inverse;
  66.       ensure
  67.      Result /= Void
  68.       end;
  69.  
  70.    infix "//" (other: NUMBER): NUMBER is
  71.      -- Divide Current by `other' (Integer division).
  72.       require
  73.      is_abstract_integer;
  74.      other.is_abstract_integer;
  75.      divisible (other);
  76.       deferred
  77.       ensure
  78.      Result.is_abstract_integer;
  79.       end;
  80.    
  81.    infix "\\" (other: NUMBER): NUMBER is
  82.      -- Remainder of division of Current by `other'.
  83.       require
  84.      is_abstract_integer;
  85.      other.is_abstract_integer;
  86.      divisible (other);
  87.       deferred
  88.       ensure
  89.      Result.is_abstract_integer;
  90.       end;
  91.    
  92.    infix "^" (exp: NUMBER): NUMBER is
  93.      -- 'Current' raised to 'exp'-th power.
  94.       require
  95.      exp.is_abstract_integer;
  96.      exp.is_positive;
  97.      not (is_zero and then exp.is_zero);
  98.       local
  99.      e: NUMBER;
  100.      factor: NUMBER;
  101.       do
  102.      Result := one;
  103.      factor := Current;
  104.      from
  105.         e := exp;
  106.      until
  107.         e.is_zero
  108.      loop
  109.         if (e @\\ 2) @= 1 then
  110.            Result := Result * factor;
  111.         end;
  112.         e := e @// 2;
  113.         factor := factor * factor;
  114.      end;
  115.       ensure
  116.      Result /= Void;
  117.      exp.is_zero implies Result.is_one;
  118.       end;
  119.    
  120.    infix "<" (other: NUMBER): BOOLEAN is
  121.      -- Is `Current' strictly less than `other'?
  122.       require
  123.      other_exists: other /= Void;
  124.       deferred
  125.       ensure
  126.      asymmetric: Result implies not (other <= Current);  
  127.       end;
  128.    
  129.    infix "<=" (other: NUMBER): BOOLEAN is
  130.      -- Is `Current' less or equal than `other'?
  131.       require
  132.      other_exists: other /= Void;
  133.       do
  134.      Result := not (other < Current);
  135.       ensure
  136.      definition: Result = (Current < other) or same_as(other);
  137.       end;
  138.    
  139.    infix ">" (other: NUMBER): BOOLEAN is
  140.      -- Is `Current' strictly greater than `other'?
  141.       require
  142.      other_exists: other /= Void;
  143.       do
  144.      Result := (other < Current);
  145.       ensure
  146.      definition: Result = (other < Current);
  147.       end;
  148.    
  149.    infix ">=" (other: NUMBER): BOOLEAN is
  150.      -- Is `Current' greater or equal than `other'?
  151.       require
  152.      other_exists: other /= Void;
  153.       do
  154.      Result := not (Current < other);
  155.       ensure
  156.      definition: Result = (other <= Current);
  157.       end;
  158.    
  159.    gcd(other: NUMBER): ABSTRACT_INTEGER is
  160.      -- Great Common Divisor of `Current' and `other'.
  161.       require
  162.      other.is_abstract_integer;     
  163.      is_abstract_integer;
  164.      is_positive;
  165.      other.is_positive;
  166.       do
  167.      if other.is_zero then 
  168.         Result ?= Current;
  169.         check
  170.            Result /= Void;
  171.         end;
  172.      else
  173.         Result := other.gcd(Current \\ other);
  174.      end;    
  175.       end;   
  176.       
  177. feature -- Unary operators for two NUMBERs :
  178.  
  179.    frozen prefix "+" : NUMBER is
  180.      -- Unary plus of 'Current'.
  181.       do
  182.      Result := Current;
  183.       ensure
  184.      Result = Current
  185.       end;
  186.    
  187.    prefix "-" : NUMBER is
  188.      -- Negative of 'Current'.
  189.       deferred
  190.       ensure
  191.      Result /= Void
  192.       end;
  193.  
  194. feature -- To know more about a NUMBER :
  195.    
  196.    in_range(lower, upper: NUMBER): BOOLEAN is
  197.      -- Return true if `Current' is in range [`lower'..`upper']
  198.       do
  199.      Result := (Current >= lower) and then (Current <= upper);
  200.       ensure
  201.      Result = (Current >= lower and Current <= upper);
  202.       end;
  203.    
  204.    compare(other: NUMBER): INTEGER is
  205.      -- Compare `Current' with `other'.
  206.      -- `<'  <==> `Result < 0'
  207.      -- `>'  <==> `Result > 0'
  208.      -- Otherwise `Result = 0'.
  209.       require
  210.      other /= Void;
  211.       do
  212.      if (Current < other) then
  213.         Result := -1;
  214.      elseif (other < Current) then
  215.         Result := 1;
  216.      end;
  217.       ensure
  218.      (Result < 0) = (Current < other);
  219.      (Result = 0) = not (Current < other or Current > other);
  220.      (Result > 0) = (Current > other);
  221.       end;
  222.    
  223.    min(other: NUMBER): NUMBER is 
  224.      -- Minimum of `Current' and `other'.
  225.       require
  226.      other /= Void;
  227.       do
  228.      if Current < other then
  229.         Result := Current;
  230.      else
  231.         Result := other;
  232.      end;
  233.       ensure
  234.      Result <= Current and then Result <= other;
  235.      compare(Result) = 0 or else other.compare(Result) = 0;
  236.       end;
  237.    
  238.    max(other: NUMBER): NUMBER is 
  239.      -- Maximum of `Current' and `other'.
  240.       require
  241.      other /= Void;
  242.       do
  243.      if (other < Current) then
  244.         Result := Current;
  245.      else
  246.         Result := other;
  247.      end;
  248.       ensure
  249.      (Result >= Current) and then (Result >= other);
  250.      compare(Result) = 0 or else other.compare(Result) = 0;
  251.       end;
  252.    
  253.    is_zero: BOOLEAN is
  254.          -- Is it 0 ?
  255.       deferred
  256.       ensure
  257.      Result = (Current @= 0)
  258.       end;
  259.    
  260.    is_one: BOOLEAN is
  261.          -- Is it 1 ?
  262.       deferred
  263.       ensure
  264.      Result = (Current @= 1)
  265.       end;   
  266.    
  267.    is_positive: BOOLEAN is
  268.      -- Is `Current' greater or equal zero ?
  269.       deferred
  270.       ensure
  271.      Result = (Current @>= 0)
  272.       end;
  273.    
  274.    is_negative: BOOLEAN is
  275.      -- Is `Current' < 0 ?
  276.       deferred
  277.       ensure
  278.      Result = (Current @< 0)
  279.       end;
  280.    
  281.    is_odd, odd: BOOLEAN is
  282.      -- Is `odd' ?
  283.       require
  284.      is_abstract_integer
  285.       do
  286.      Result := (Current @\\ 2).is_one;
  287.       end;
  288.    
  289.    is_even, even: BOOLEAN is
  290.      -- Is `even' ?
  291.       require
  292.      is_abstract_integer
  293.       do
  294.      Result := (Current @\\ 2).is_zero;
  295.       end;
  296.    
  297.    frozen same_as(other: NUMBER): BOOLEAN is
  298.      -- Is it the same NUMBER as `other' ?
  299.      --
  300.      -- Note: because `is_equal' uses type like Current for 
  301.      -- `other', this is impossible to use directely `is_equal'.
  302.       require
  303.      other /= Void
  304.       local
  305.      x: like Current;
  306.       do
  307.      x ?= other;
  308.      Result := (x /= Void) and then x.is_equal(Current);
  309.       ensure
  310.      Result implies other.is_equal(Current)
  311.       end;
  312.    
  313.    frozen is_abstract_integer: BOOLEAN is
  314.       local
  315.      abstract_integer: ABSTRACT_INTEGER;
  316.       do
  317.      abstract_integer ?= Current;
  318.      Result := abstract_integer /= Void;
  319.       end;
  320.    
  321.    frozen is_abstract_fraction: BOOLEAN is
  322.       local
  323.      abstract_fraction : ABSTRACT_FRACTION;
  324.       do
  325.      abstract_fraction ?= Current;
  326.      Result := abstract_fraction /= Void;
  327.       end;
  328.    
  329.    frozen is_integer: BOOLEAN is
  330.      -- Does `Current' value fit on an INTEGER ?
  331.       do
  332.      if is_abstract_integer then
  333.         if Current @<= Maximum_integer then
  334.            Result := Current @>= Minimum_integer;
  335.         end;
  336.      end;
  337.       ensure
  338.      Result implies is_abstract_integer;
  339.       end;   
  340.    
  341.    frozen is_double: BOOLEAN is
  342.       do
  343.      if Current #>= Minimum_double then
  344.         Result := Current #<= Maximum_double;
  345.      end;
  346.       end;
  347.    
  348. feature -- Conversions and printing :
  349.    
  350.    to_integer: INTEGER is
  351.       require
  352.      is_integer
  353.       deferred
  354.       end;
  355.    
  356.    to_double: DOUBLE is
  357.       require
  358.      is_double
  359.       deferred
  360.       end;
  361.    
  362.    to_string: STRING is
  363.      -- Convert the NUMBER into a new allocated STRING. 
  364.      -- Note: see `append_in' to save memory.
  365.       do
  366.      Result := "This is a local STRING buffer ....";
  367.      Result.clear;
  368.      append_in(Result);
  369.      Result := Result.twin;
  370.       end;
  371.  
  372.    frozen digit: CHARACTER is
  373.      -- Gives the corresponding CHARACTER for range 0..9.
  374.       require
  375.      to_integer.in_range(0,9)
  376.       do
  377.      Result := to_integer.digit;
  378.       ensure
  379.      ("0123456789").has(Result);
  380.      Current @= Result.value;
  381.       end;
  382.  
  383.    append_in(str: STRING) is
  384.      -- Append the equivalent of `to_string' at the end of 
  385.      -- `str'. Thus you can save memory because no other
  386.      -- STRING is allocate for the job.
  387.       require
  388.      str /= Void;
  389.       deferred
  390.       end; 
  391.  
  392. feature -- To mimic NUMERIC :
  393.    
  394.    divisible(other: NUMBER): BOOLEAN is
  395.      -- Is `other' a valid divisor for `Current' ?
  396.       require
  397.      other /= Void
  398.       do
  399.      Result := not other.is_zero;
  400.       end;
  401.    
  402.    one: NUMBER is
  403.      -- The neutral element of multiplication.
  404.       once
  405.      !SMALL_INTEGER!Result.make(1);
  406.       ensure
  407.      neutral_element: -- Result is the neutral element of 
  408.      -- multiplication.
  409.       end;
  410.    
  411.    zero: NUMBER is
  412.      -- The neutral element of addition.
  413.       once
  414.      !SMALL_INTEGER!Result.make(0);
  415.       ensure
  416.      neutral_element: -- Result is the neutral element of 
  417.      -- addition.
  418.       end;
  419.    
  420.    frozen sign: INTEGER is
  421.       do
  422.      if is_positive then
  423.         Result := 1;
  424.      elseif is_negative then
  425.         Result := - 1;
  426.      end;
  427.       end;
  428.    
  429.    sqrt: DOUBLE is
  430.      -- Compute the square routine.
  431.       require
  432.      is_double
  433.       do
  434.      Result := to_double.sqrt;
  435.       end;
  436.    
  437.    frozen log: DOUBLE is
  438.       require
  439.      is_double
  440.       do
  441.      Result := to_double.log;
  442.       end;
  443.    
  444.    abs: NUMBER is
  445.       do
  446.      if is_negative then
  447.         Result := -Current;
  448.      else
  449.         Result := Current;
  450.      end;
  451.       end;
  452.       
  453. feature -- To mix NUMBER and INTEGER :
  454.    
  455.    infix "@+" (other: INTEGER): NUMBER is
  456.      -- Sum of `Current' and `other'.
  457.       deferred
  458.       ensure
  459.      Result /= Void
  460.       end;
  461.    
  462.    infix "@-" (other: INTEGER): NUMBER is
  463.      -- Difference of `Current' and `other'.
  464.       local
  465.      num: ABSTRACT_INTEGER;
  466.       do
  467.      if other = Minimum_integer then
  468.         !LARGE_POSITIVE_INTEGER!num.make_smaller(0);
  469.         Result := Current + num;
  470.      else
  471.         Result := Current @+ (- other);
  472.      end;
  473.       ensure
  474.      Result /= Void
  475.       end;
  476.    
  477.    infix "@*" (other: INTEGER): NUMBER is
  478.       require
  479.      other /= Void
  480.       deferred
  481.       ensure
  482.      Result /= Void
  483.       end;
  484.    
  485.    infix "@/" (other: INTEGER): NUMBER is
  486.      -- Quotient of `Current` and `other`.
  487.       require
  488.      other /= 0;
  489.       deferred
  490.       ensure
  491.      Result /= Void
  492.       end; 
  493.    
  494.    infix "@//" (other: INTEGER): NUMBER is
  495.      -- Divide Current by `other' (Integer division).
  496.       require
  497.      is_abstract_integer;
  498.      other /= 0;
  499.       deferred
  500.       ensure
  501.      Result.is_abstract_integer;
  502.       end;
  503.    
  504.    
  505.    infix "@\\" (other: INTEGER): NUMBER is
  506.      -- Remainder of division of Current by `other'.
  507.       require
  508.      is_abstract_integer;
  509.      other /= 0;
  510.       deferred
  511.       ensure
  512.      Result.is_abstract_integer;
  513.       end;
  514.    
  515.    infix "@^" (exp: INTEGER): NUMBER is
  516.       require
  517.      (exp > 0) or else not is_zero
  518.       local
  519.      int : INTEGER;
  520.      other : NUMBER;
  521.       do
  522.      int := exp.abs;
  523.      inspect int
  524.      when 0 then
  525.         !SMALL_INTEGER!Result.make(1);
  526.      when 1 then
  527.         Result := Current;
  528.      else
  529.         from
  530.            int := int - 1;
  531.            other := Current;
  532.            Result := Current;
  533.         until
  534.            int < 2
  535.         loop
  536.            if int.odd then
  537.           Result := Result * other;
  538.            end;
  539.            other := other * other; -- methode sqrt : ^2
  540.            int := int // 2;
  541.         end;
  542.         Result := Result * other;
  543.      end;
  544.      if (exp < 0) then
  545.         Result := Result.inverse; 
  546.      end;
  547.       ensure
  548.      Result /= Void;
  549.      Result /= Current implies (exp /= 1 or else not is_zero);
  550.       end;
  551.    
  552.    infix "@=" (other: INTEGER): BOOLEAN is
  553.      -- Is Current equal `other' ?
  554.       deferred
  555.       end;
  556.    
  557.    infix "@<" (other: INTEGER): BOOLEAN is
  558.      -- Is 'Current' strictly less than 'other'?
  559.       deferred
  560.       ensure
  561.      Result = not (Current @>= other);
  562.       end;
  563.    
  564.    infix "@<=" (other: INTEGER): BOOLEAN is
  565.      -- Is 'Current' less or equal 'other'?
  566.       deferred
  567.       ensure
  568.      Result = not (Current @> other);
  569.       end;
  570.    
  571.    infix "@>" (other: INTEGER): BOOLEAN is
  572.      -- Is 'Current' strictly greater than 'other'?
  573.       deferred
  574.       ensure
  575.      Result = not (Current @<= other);
  576.       end;
  577.    
  578.    infix "@>=" (other: INTEGER): BOOLEAN is
  579.      -- Is 'Current' greater or equal than 'other'?
  580.       deferred
  581.       ensure
  582.      Result = not (Current @< other);
  583.       end;
  584.    
  585. feature -- To mix NUMBER and DOUBLE :
  586.  
  587.    infix "#=" (other: DOUBLE): BOOLEAN is
  588.      -- Is Current equal `other` ?
  589.       deferred
  590.       end;
  591.    
  592.    infix "#<" (other: DOUBLE): BOOLEAN is
  593.      -- Is 'Current' strictly less than 'other'?
  594.       deferred
  595.       ensure
  596.      Result implies not (Current #>= other);
  597.       end;
  598.    
  599.    infix "#<=" (other: DOUBLE): BOOLEAN is
  600.      -- Is `Current` less or equal `other`?
  601.       deferred
  602.       ensure
  603.      Result = not (Current #> other);
  604.       end;
  605.    
  606.    infix "#>" (other: DOUBLE): BOOLEAN is
  607.      -- Is 'Current' strictly greater than 'other'?
  608.       deferred
  609.       ensure
  610.      Result = not (Current #<= other);
  611.       end;   
  612.    
  613.    infix "#>=" (other: DOUBLE): BOOLEAN is
  614.      -- Is `Current` greater or equal than `other`?
  615.       deferred
  616.       ensure
  617.      Result = not (Current #< other);
  618.       end;
  619.    
  620. feature -- Misc :
  621.    
  622.    out_in_tagged_out_memory, fill_tagged_out_memory is
  623.       do
  624.      append_in(tagged_out_memory);
  625.       end;   
  626.    
  627.    hash_code: INTEGER is
  628.       do
  629.      if is_double then
  630.         Result := to_double.hash_code;
  631.      else
  632.         not_yet_implemented;
  633.      end;
  634.       end;
  635.    
  636.    inverse: NUMBER is
  637.       require
  638.      divisible(Current)
  639.       deferred
  640.       ensure
  641.      Result /= Void
  642.       end;   
  643.    
  644.    factorial: NUMBER is
  645.       require
  646.      is_abstract_integer;
  647.      is_positive
  648.       local
  649.      n: NUMBER;
  650.       do
  651.      if is_zero then
  652.         !SMALL_INTEGER!Result.make(1);
  653.      else
  654.         from
  655.            Result := Current;
  656.            n := Current @- 1;
  657.         until
  658.            n @= 0            
  659.         loop
  660.            Result := n * Result;
  661.            n := n @- 1;
  662.         end;
  663.      end;
  664.       ensure
  665.      Result.is_abstract_integer;
  666.      Result.is_positive
  667.       end;
  668.    
  669. feature {NUMBER} -- Implementation :
  670.    
  671.    frozen add_with_small_integer(other: SMALL_INTEGER): NUMBER is
  672.       require
  673.      other /= Void
  674.       do
  675.      Result := Current @+ other.to_integer;
  676.       ensure
  677.      Result /= Void
  678.       end;
  679.    
  680.    add_with_large_positive_integer(other: LARGE_POSITIVE_INTEGER): NUMBER is
  681.       require
  682.      other /= Void
  683.       deferred
  684.       ensure
  685.      Result /= Void
  686.       end;
  687.    
  688.    add_with_large_negative_integer(other: LARGE_NEGATIVE_INTEGER): NUMBER is
  689.       require
  690.      other /= Void
  691.       deferred
  692.       ensure
  693.      Result /= Void
  694.       end;
  695.    
  696.    add_with_small_fraction(other: SMALL_FRACTION): NUMBER is
  697.       require
  698.      other /= Void
  699.       deferred
  700.       ensure
  701.      Result /= Void
  702.       end;
  703.    
  704.    add_with_large_fraction(other: LARGE_FRACTION): NUMBER is
  705.       require
  706.      other /= Void
  707.       deferred
  708.       ensure
  709.      Result /= Void
  710.       end;
  711.    
  712.    multiply_with_small_integer(other: SMALL_INTEGER): NUMBER is
  713.       require
  714.      other /= Void
  715.       do
  716.      Result := Current @* other.to_integer;
  717.       ensure
  718.      Result /= Void
  719.       end;
  720.    
  721.    multiply_with_large_positive_integer(other: LARGE_POSITIVE_INTEGER): NUMBER is
  722.       require
  723.      other /= Void
  724.       deferred
  725.       ensure
  726.      Result /= Void
  727.       end;
  728.    
  729.    multiply_with_large_negative_integer(other: LARGE_NEGATIVE_INTEGER): NUMBER is
  730.       require
  731.      other /= Void
  732.       deferred
  733.       ensure
  734.      Result /= Void
  735.       end;
  736.    
  737.    multiply_with_small_fraction(other: SMALL_FRACTION): NUMBER is
  738.       require
  739.      other /= Void
  740.       deferred
  741.       ensure
  742.      Result /= Void
  743.       end;
  744.    
  745.    multiply_with_large_fraction(other: LARGE_FRACTION): NUMBER is
  746.       require
  747.      other /= Void
  748.       deferred
  749.       ensure
  750.      Result /= Void
  751.       end;
  752.    
  753.    greater_with_small_integer(other: SMALL_INTEGER): BOOLEAN is
  754.       require
  755.      other /= Void;
  756.       do
  757.      Result := Current @> other.to_integer;
  758.       end;
  759.    
  760.    greater_with_large_positive_integer(other: LARGE_POSITIVE_INTEGER): BOOLEAN is
  761.       require
  762.      other /= Void;
  763.       deferred
  764.       end;
  765.    
  766.    greater_with_large_negative_integer(other: LARGE_NEGATIVE_INTEGER): BOOLEAN is
  767.       require
  768.      other /= Void;
  769.       deferred
  770.       end;
  771.    
  772.    greater_with_small_fraction(other: SMALL_FRACTION): BOOLEAN is
  773.       require
  774.      other /= Void;
  775.       deferred
  776.       end;
  777.    
  778.    greater_with_large_fraction(other: LARGE_FRACTION): BOOLEAN is
  779.       require
  780.      other /= Void;
  781.       deferred
  782.       end;
  783.    
  784.    to_string_format(s: INTEGER): STRING is
  785.      -- Same as `to_string' but the result is on `s' character and the 
  786.      -- number is right aligned. 
  787.      -- Note: see `append_in_format' to save memory.
  788.       require
  789.      to_string.count <= s;
  790.       do
  791.      from  
  792.         tmp_string.clear;
  793.         append_in(tmp_string);
  794.      until
  795.         tmp_string.count >= s
  796.      loop
  797.         tmp_string.add_first(' ');
  798.      end;
  799.      Result := tmp_string.twin;
  800.       ensure
  801.      Result.count = s;
  802.       end; 
  803.    
  804.    append_in_format(str: STRING; s: INTEGER) is
  805.      -- Append the equivalent of `to_string_format' at the end of 
  806.      -- `str'. Thus you can save memory because no other
  807.      -- STRING is allocate for the job.
  808.       do
  809.      from
  810.         tmp_string.clear;
  811.         append_in(tmp_string);
  812.      until
  813.         tmp_string.count >= s
  814.      loop
  815.         tmp_string.add_first(' ');
  816.      end;
  817.      str.append(tmp_string);
  818.       ensure
  819.      str.count >= (old str.count) + s;
  820.       end;
  821.    
  822. feature {NONE}   
  823.    
  824.    max_double: NUMBER is
  825.       local
  826.      nt: NUMBER_TOOLS;
  827.       once
  828.      !!nt;
  829.      Result := nt.from_string(Maximum_double.to_string);
  830.       end;
  831.    
  832.    min_double: NUMBER is
  833.       once
  834.      Result := -max_double @- 1;
  835.       end;
  836.    
  837.    greater_large_negative_integer: LARGE_NEGATIVE_INTEGER is
  838.       once
  839.      !LARGE_NEGATIVE_INTEGER!Result.make_smaller(0);
  840.       end;
  841.    
  842.    Base: INTEGER is 
  843.       once
  844.      Result := Minimum_integer;
  845.       end;
  846.    
  847.    Half_base: INTEGER is
  848.       once
  849.      from
  850.         Result := 1;
  851.      until
  852.         ((Result.to_double * 2)^2) > Double_base
  853.      loop
  854.         Result := Result * 2;
  855.      end;
  856.       end;
  857.    
  858.    Double_base: DOUBLE is
  859.       once
  860.      Result := Maximum_integer.to_double + 1;
  861.       end
  862.    
  863.    smaller_correct_fixed: FIXED_ARRAY[INTEGER] is
  864.       once
  865.      !!Result.make(2);
  866.      Result.put(1,1);
  867.       end;
  868.    
  869.    tmp_string: STRING is 
  870.       once
  871.      !!Result.make(128);
  872.       end;
  873.    
  874.    temp_2_digints: FIXED_ARRAY[INTEGER] is
  875.       once
  876.      !!Result.make(2);
  877.       end;
  878.    
  879.    temp_1_digint: FIXED_ARRAY[INTEGER] is
  880.       once
  881.      !!Result.make(1);
  882.       end;
  883.    
  884.    temp: FIXED_ARRAY[INTEGER] is
  885.       once
  886.      !!Result.make(3);
  887.       end;
  888.    
  889.    temp_from_mult: FIXED_ARRAY[INTEGER] is
  890.       once
  891.      !!Result.make(0);
  892.       end;
  893.    
  894.    temp_quotient: FIXED_ARRAY[INTEGER] is
  895.       once
  896.      !!Result.make(0);
  897.       end;
  898.    
  899.    temp_remainder: FIXED_ARRAY[INTEGER] is
  900.       once
  901.      !!Result.make(0);
  902.       end;
  903.    
  904.    temp_division: FIXED_ARRAY[INTEGER] is
  905.       once
  906.      !!Result.make(0);
  907.       end;
  908.    
  909. end -- NUMBER
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.